package main

import (
	"fmt"
	"sync"
)

func test() {
	fmt.Println("map 定义方式")
	m := map[int]string{} // map[key类型]value类型{初始值}
	m[1] = "dong"
	fmt.Println(m[1])

	m1 := map[int]struct {
		name string
		age  int
	}{
		1: {"dong", 18},
	}
	fmt.Println(m1[1])

	m2 := make(map[int]string, 2)
	fmt.Println(m2)
}

func test1() {
	fmt.Println("常用操作")

	m := map[int]string{
		1: "dong",
		2: "xixi",
	}

	// 判断key是否存在
	if v, ok := m[2]; ok {
		fmt.Println(v)
	}

	// key 不存在不会报错 返回\0
	fmt.Println(m[3])

	// 删除key 不存在 不报错
	delete(m, 1)
	fmt.Println(m)

	// 获取键值对数量
	fmt.Println(len(m))

	// 可使用range迭代
	for k, v := range m {
		fmt.Println(k, v)
	}
}

func test2() {
	fmt.Println("不要依赖range遍历返回key的次序")
	mapper := make(map[int]string)
	mapper[1] = "1"
	mapper[2] = "2"
	mapper[3] = "3"
	mapper[4] = "4"
	mapper[5] = "5"
	mapper[6] = "6"
	mapper[7] = "7"

	for k, v := range mapper {
		fmt.Println(k, v)
	}
}

type user struct {
	name string
}

func test3() {

	fmt.Println("从map中取出的是value的复制品，并不可以直接对其成员修改（struct）")
	u := user{
		name: "dong",
	}
	// 错误示例
	// m := map[int]user{
	// 	1: u,
	// }
	// m[1].name = "xixi" // Error: cannot assign to struct field m[1].name in map

	// 通过指针修改
	m := map[int]*user{
		1: &u,
	}
	m[1].name = "xixi"
	fmt.Println(m[1].name)
	fmt.Printf("%T", m[1].name)
}

func test4() {
	fmt.Println("迭代时删除键值，同时新增")
	m := map[int]string{
		1: "a",
		2: "b",
		3: "c",
	}

	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		for k, _ := range m {
			if k == 3 {
				delete(m, 3)
			}
		}
		wg.Done()
	}()
	go func() {
		m[3] = "d"
		wg.Done()
	}()

	fmt.Println(m)
}
func main() {
	// test()
	// test1()
	// test2()
	// test3()
	test4()
}
